sojson.com
至少涉及到5个表，用户表，角色表，权限表，用户和角色关联表，角色和权限关联表。
进行shiro的相关配置及代码定义

cookie禁用时的sessionId的地址重写response.encodeURL(url);//将超链接的url地址进行重写,该方法自动将JSESSIONID拼接在地址后面。

1. 初始权限动态加载
(1)按照shiro格式配置filterChainDefinitions的spring文件。
因为是从上往下去匹配，只要匹配中了，就不匹配了，这个是重点，所以要有序。
anon	 org.apache.shiro.web.filter.authc.AnonymousFilter  ---Shiro 的默认Filter 对应的类
    <!--	初始配置，现采用自定义	-->
    <!--		<property name="filterChainDefinitions" >-->
    <!--			<value>-->
    <!--				/** = anon-->
    <!--				/page/login.jsp = anon-->
    <!--				/page/register/* = anon-->
    <!--				/page/index.jsp = authc-->
    <!--				/page/addItem* = authc,roles[数据管理员]-->
    <!--				/page/file* = authc,roleOR[普通用户,数据管理员]-->
    <!--				/page/listItems* = authc,roleOR[数据管理员,普通用户]-->
    <!--				/page/showItem* = authc,roleOR[数据管理员,普通用户]-->
    <!--				/page/updateItem*=authc,roles[数据管理员]-->
    <!--            </value>-->
    <!--		</property>-->
		<!-- 读取初始自定义权限内容-->

/admin/ask/editor.shtml = role[2008,2009]
    //解释一下上面代码的意思，就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role 的Shiro Filter ，并且参数为数组[2008,2009] ，这里参数的意思是角色编号

（2）在ShiroManagerImpl中，将这些配置作为独立的配置文件放置。shiro_base_auth.ini  没有采用properties，因为java带有的properties读取文件是用的hashtable
而shiro要求这些配置的读取是要自上而下读取的。要有序，可以自己重写，用LinkedHashMap,保证有序。
也可以自己写一个类，有序读取。com.sojson.core.config.INI4j
shrio 权限管理filterChainDefinitions过滤器配置
在spring-shiro中

在UserLoginController登录的时候
先调用service进行用户的插入entity = userService.insert(entity);
再调用shiro的login做相关处理。entity = TokenManager.login(entity, Boolean.TRUE);

token的进入
在TokenManager的login中，new一个ShiroToken的时候，传入用户名和密码。并通过SecurityUtils.getSubject().login(token); 将token传给shiro

在退出的时候
TokenManager的logout中，直接调用shiro的SecurityUtils.getSubject().logout();进行退出

2.自定义权限校验Filter定义。
<bean id="login" class="com.sojson.core.shiro.filter.LoginFilter"/>

<property name="filterChainDefinitions" value="#{shiroManager.loadFilterChainDefinitions()}"/>
<property name="filters">
    <util:map>
        <entry key="login" value-ref="login"></entry>
        <entry key="role" value-ref="role"></entry>
        <entry key="simple" value-ref="simple"></entry>
        <entry key="permission" value-ref="permission"></entry>
        <entry key="kickout" value-ref="kickoutSessionFilter"></entry>
    </util:map>
</property>

3.Shiro Ajax请求权限不满足，拦截后解决方案。
    LoginFilter中，Ajax不能做页面redirect和forward跳转，所以Ajax请求假如没登录，那么这个请求给用户的感觉就是没有任何反应，而用户又不知道用户已经退出了。

freemaker的宏macro。在index.ftl中以<@_top.top 1/>这种格式对top.ftl等文件进行拆分式的调用。

4.Shiro freemaker标签的使用，相关配置在spring_mvc中（根目录，时间格式等）。
http://www.sojson.com/blog/143.html

jsp标签的使用
http://www.sojson.com/blog/144.html

5.Shiro 登录后跳转到最后一个访问的页面。 SimpleAuthFilter中
在shiro中的WebUtils方法，可以获取到上一个请求的相关信息。

6.
user表的status实现禁止用户登录。CustomSessionManager类
在线用户显示，从Redis中获取所有有效的Session。踢出时，SimpleAuthFilter简单提示

7.MD5加盐。
MD5(登录帐号 + “固定值” + 密码)

8.index.ftl中<@_top.top 1/> 引用top.ftl中的macro宏。
 ${(index==1)?string('active','')}   这个freemaker中的index标签。index默认选中的列表

1.在ShiroFilterUtils中定义的loginurl为/u/login.shtml.
web.xml中的欢迎页定义的为user/index.shtml.当tomcat可以检测到存在对应的文件，
那么会走到spring的拦截器下，先是被shiro拦截，跳转至loginurl。（此时也有spring中定义的ftl静态文件拦截规则）

2.SuppressWarnings
@SuppressWarnings(“unchecked ”)
    :作用是告诉编译器一个指令，对被批注的代码内部的某些警告保持静默。
  unchecked （抑制没有进行类型检查操作的警告）
  unused（抑制没被使用过的代码的警告）
  all （抑制所有警告）

3.principals：身份，即主体的标识属性，可以是任何东西，如用户名、邮箱等，唯一即可。
  一个主体可以有多个principals，但只有一个Primary principals，一般是用户名/密码/手机号。
  getCredentials  即使对应获取密码，

4.所以在Realm中，要继承AuthorizingRealm，实现doGetAuthorizationInfo（授权，获取角色所有的权限）和doGetAuthenticationInfo（认证，获取用户名，密码）
在realm中可以配置密码比较器， 后将Realm注入到securityManager。

5.在loginController中
    // 先获取到Subject对象
    Subject subject = SecurityUtils.getSubject();
    // 创建UsernamePasswordToken对象，封装用户名和密码
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    // 使用shiro框架进行校验，调用时，shiro应该会调用doGetAuthenticationInfo进行
    subject.login(token);
    // 获取返回的结果
    User user = (User) subject.getPrincipal();
